//////////////////////////////////////////////////////////////////////////
//	Filename	:	GamePlayState.h
//
//	Author		:	Ramon Johannessen (RJ)
//
//	Purpose		:	To define the CGamePlayState class. This state handles
//					all gameplay code.
//////////////////////////////////////////////////////////////////////////
#ifndef GAMEPLAYSTATE_H
#define GAMEPLAYSTATE_H

#include "IGameState.h"

class CGameMenu;
class CMap;
class CPlayer;

typedef vector<CPlayer*> Players;
class CGamePlayState : public IGameState
{
private:
	bool m_bIsPaused;
	CGameMenu* m_pCurrentMenuState;

	int		m_nNumPlayers;

	// Constructor
	CGamePlayState(void);
	// Copy Constructor
	CGamePlayState(const CGamePlayState&);
	// Assignment Operator
	CGamePlayState& operator=(const CGamePlayState&);
	//Destructor
	~CGamePlayState(void);
public:
	///////////////////////////////////////////////////////////////////
	//	Function: GetInstance
	//
	//	Purpose: Init the instance and return a pointer to the instance
	///////////////////////////////////////////////////////////////////
	static CGamePlayState* GetInstance(void);
  
	inline bool GetPaused(){return m_bIsPaused;}
	inline void SetPaused(bool p){m_bIsPaused = p;}

	int			GetNumPlayers()		const	{ return m_nNumPlayers; }
	//////////////////////////////////////////////////////////////////////////
	//	Function: ChangeMap
	//
	//	Purpose : to change from one map to another...e.g., going into a battle
	//				from the world map
	//////////////////////////////////////////////////////////////////////////
	void ChangeMap(bool bWorldMap = true, int mapID = 0);

	///////////////////////////////////////////////////////////////////
	//	Function:	Enter
	//
	//	Purpose:	Enter and initialize the current state
	//////////////////////////////////////////////////////////////////
	void Enter(void);
	//////////////////////////////////////////////////////////////////
	//	Function: Exit
	//
	//	Purpose: Cleans up all the state info
	///////////////////////////////////////////////////////////////////
	void Exit(void);
	///////////////////////////////////////////////////////////////////
	//	Function: Input
	//
	//	Purpose: Read the input from the user
	//  RETURN(eInputReturnType)	: whether or not we need to exit
	//									or return early (changing from current state)
	/////////////////////////////////////////////////////////////////
	eInputReturnType Input(double, const POINT&);
	/////////////////////////////////////////////////////////////////
	//	Function:	Update
	//
	//	Purpose:	Update the state objects
	////////////////////////////////////////////////////////////////
	void Update(double dTimeStep);
	////////////////////////////////////////////////////////////////
	//	Function:	Render
	//
	//	Purpose:	Render the objects of the state
	////////////////////////////////////////////////////////////////
	void Render(void);
	////////////////////////////////////////////////////////////////
	//	Function:	SaveGame
	//
	//	Purpose:	Saves the current game to a binary file
	////////////////////////////////////////////////////////////////
	void SaveGame(const char* fileName);
	////////////////////////////////////////////////////////////////
	//	Function:	LoadGame
	//
	//	Purpose:	Loads the selected game from a binary file
	////////////////////////////////////////////////////////////////
	void LoadGame(const char* fileName);
};
#endif